////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2008 Michiel Helvensteijn                                    //
//                                                                            //
// This file is part of the Mist compiler.                                    //
//                                                                            //
// The Mist compiler is free software: you can redistribute it and/or modify  //
// it under the terms of the GNU General Public License as published by       //
// the Free Software Foundation, either version 3 of the License, or          //
// (at your option) any later version.                                        //
//                                                                            //
// The Mist compiler is distributed in the hope that it will be useful,       //
// but WITHOUT ANY WARRANTY; without even the implied warranty of             //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              //
// GNU General Public License for more details.                               //
//                                                                            //
// You should have received a copy of the GNU General Public License          //
// along with the Mist compiler.  If not, see <http://www.gnu.org/licenses/>. //
////////////////////////////////////////////////////////////////////////////////

#include "parameterpolicy.hpp"

const shared_ptr<ParameterPolicy> ParameterPolicy::ByValue    (new ParameterPolicy("val", AccessType(false, false, true, false), false, true, AccessType(true, true, true, true), false, false));
const shared_ptr<ParameterPolicy> ParameterPolicy::ByReference(new ParameterPolicy("ref", AccessType(true, false, true, true)  , true , true, AccessType(true, true, true, true), false, true ));
const shared_ptr<ParameterPolicy> ParameterPolicy::ByAlias    (new ParameterPolicy("als", AccessType(true, true, true, true)   , true , true, AccessType(true, true, true, true), true , true ));

bool ParameterPolicy::operator==(const ParameterPolicy& other) const {
	return (actualAccess     == other.actualAccess
         && identityPassed   == other.identityPassed
         && valuePassed      == other.valuePassed
         && formalAccess     == other.formalAccess
         && identityReturned == other.identityReturned
         && valueReturned    == other.valueReturned);
}

string to_string(ParameterPolicy pp) {
	string result;
	
	result += "(" + to_string(pp.actualAccess) + ")";
	result += (pp.identityPassed ? ">" : "x");
	result += (pp.valuePassed ? ">" : "x");
	result += "(" + to_string(pp.formalAccess) + ")";
	result += (pp.identityReturned ? ">" : "x");
	result += (pp.valueReturned ? ">" : "x");
	
	return result;
}
